package wangxiaotao.utils;

import wangxiaotao.entity.TreeEntity;

import java.util.ArrayList;
import java.util.List;

/**
 * 树状数据解析工具类
 */
public class TreeParserUtils {

    /**
     * 树状
     * @param topId 开始id
     * @param end 是否遍历全部 true 遍历两层 false遍历全部
     * @param entityList
     * @param <E>
     * @return
     */
    public static <E extends TreeEntity<E>> List<E> getTreeList(Integer topId,boolean end, List<E> entityList){
        List<E> resultList = new ArrayList<>();
        // 获取顶层父亲元素集合
        Integer parentId;
        //遍历顶层父元素
        for (E entity : entityList) {
            parentId = entity.getParentId();
            //如果存在需要查询的层次
            if (parentId == null || topId.equals(parentId)) {
                //条件进返回列表
                resultList.add(entity);
            }
        }
        // 获取每个顶层元素的子数据集合
        for (E entity : resultList) {
            //子元素需要再次变量子元素的子元素
            if (end){
                List<E> childList = new ArrayList<>();
                Integer childId = entity.getId();
                // 孩子集的直接孩子集对象
                for (E childEntity : entityList) {
                    if (childEntity.getParentId().equals(childId)) {
                        //子元素添加
                        childList.add(childEntity);
                    }
                }
                entity.setChildList(childList);
            }else {
                entity.setChildList(getSubList(entity.getId(), entityList));
            }
        }
        return resultList;
    }


    /**
     * 子数据集合
     * @param id
     * @param entityList
     * @param <E>
     * @return
     */
    private static <E extends TreeEntity<E>> List<E> getSubList(Integer id, List<E> entityList) {
        List<E> childList = new ArrayList<>();
        Integer parentId;
        // 孩子集的直接孩子集对象
        for (E entity : entityList) {
            parentId = entity.getParentId();
            if (id.equals(parentId)) {
                //子元素添加
                childList.add(entity);
            }
        }
        // 子集的间接子对象
        for (E entity : childList) {
            //再次寻找子元素的子元素
            entity.setChildList(getSubList(entity.getId(), entityList));
        }
        // 递归退出条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;
    }

}
